package co.com.coomeva.adminEvaluacion.managedBean;

import java.util.Iterator;
import java.util.List;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import co.com.coomeva.adminEvaluacion.delegado.DelegadoEdPItem;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPPeriodoEvaluacion;
import co.com.coomeva.adminEvaluacion.util.FacesUtils;

public class ReporteInconsistenciasBean {

	private MensajeBean mensaje = null;
	private Boolean readOnly = false;
	private Long codPeriodo;
	
	private String nombrePeriodo;
	
	private DelegadoEdPItem delegadoItems;
	
	private List<EdPPeriodoEvaluacion> listPeriodos = null;
	private SelectItem[] periodoItems;
	
	private String rutaArchivo;
	private String usuarioRed;
	private Long gerenciaCodigo;
	
	/**
	 * Constructor de la clase
	 */
	public ReporteInconsistenciasBean() {
		
		/**************SIMULADO**************/
		/*FacesUtils.getSession().setAttribute("gerencia_codigo", "1");
		FacesUtils.getSession().setAttribute("usuario", "jorteruiz");
		FacesUtils.getSession().setAttribute("usuario_red", "jorteruiz");
		FacesUtils.getSession().setAttribute("unidad_negocio_codigo", new Long(8));
		FacesUtils.getSession().setAttribute("nombre_periodo_activo", "nombrePeriodo");
		FacesUtils.getSession().setAttribute("cons_periodo_activo", new Long(7));*/
		/************************************/
		
		delegadoItems = DelegadoEdPItem.getInstance();
		mensaje = (MensajeBean) FacesUtils.getManagedBean("mensajeBean");
		
		//Se validan las variables de sesion
		if (FacesUtils.getSession().getAttribute("usuario") == null ||
				FacesUtils.getSession().getAttribute("usuario_red") == null ||
				FacesUtils.getSession().getAttribute("gerencia_codigo") == null) {
			System.out.println("DEBE INICIAR SESION!!!");
			//No ha iniciado sesion!!
			FacesContext facesContext = FacesContext.getCurrentInstance();
			NavigationHandler navigationHandler = facesContext.getApplication().getNavigationHandler();
			navigationHandler.handleNavigation(facesContext, null, "irIngresar");
		} else {
			System.out.println("LA SESION YA LA HA INICIADO!!!");
			
			gerenciaCodigo = new Long((String) FacesUtils.getSession().getAttribute("gerencia_codigo"));
			usuarioRed = (String) FacesUtils.getSession().getAttribute("usuario_red");
			
			nombrePeriodo = (String) FacesUtils.getSession().getAttribute("nombre_periodo_activo");
			codPeriodo = (Long) FacesUtils.getSession().getAttribute("cons_periodo_activo");
			
			if (codPeriodo == null) {
				mensaje.mostrarMensaje("Debe existir un periodo activo para la empresa del usuario administrador");
			}
		}
	}	
	
	/**
	 * Metodo que permite generar el archivo de inconsistencias
	 * @param event
	 */
	public void generarArchivo(ActionEvent event) {
		try {
			readOnly = false;
			rutaArchivo = null;
			
			//Se valida que los campos del formulario esten completos
			if(validarCampos()){
				 					
				String strMensaje = delegadoItems.generarReporteInconsistencias(codPeriodo);
				String nombreArchivo = delegadoItems.obtenerArchInconsistencias();
				//System.out.println("nombreArchivo = "+nombreArchivo);
				
				if(nombreArchivo != null && !nombreArchivo.equals("")){
					readOnly = true;
					rutaArchivo = FacesUtils.getUrlAplicacion() + "/archivosExportar/" + nombreArchivo;
					//System.out.println("rutaArchivo = "+rutaArchivo);
				}
				else
					readOnly = false;
				
				mensaje.mostrarMensaje(strMensaje);
			}
		
		} catch (Exception e) {
			e.printStackTrace();
			mensaje.mostrarMensaje(e.getMessage());
		}
	}
		
	/**
	 * Metodo para limpiar los campos del formulario
	 * @param event
	 */
	public void limpiar( ActionEvent event ){
	    limpiarcampos();
	    mensaje.ocultarMensaje();
	}
		
	/**
	 * Metodo para reiniciar las variables de la clase
	 */
	private void limpiarcampos(){
		//Resetea las variables
	    readOnly = false;
	    //codPeriodo = null;
		rutaArchivo = null;
	}
		
	/**
	 * Metodo que permite validar los campos del formulario
	 * @return Booleano que indica si son validos o no
	 * @throws Exception
	 */
	private boolean validarCampos() throws Exception {
				
		boolean bValido = false;
		if (codPeriodo != null && codPeriodo.longValue() > 0) {
			//Validacion para numeros
			bValido = true;
		}
		else{
			codPeriodo = null;
			mensaje.mostrarMensaje("Debe existir un periodo activo para la empresa del usuario administrador");
		}
			
		return bValido;
	}
	
	/**
	 * Metodo que carga los periodos a un arreglo para ser mostrados en el formulario
	 * @return Arreglo de SelectItem
	 */
	public SelectItem[] listadoPeriodos() {
    	
		try {			    		
			//listPeriodos = delegadoItems.consultarPeriodos();		
			
			if (listPeriodos != null && listPeriodos.size() > 0){
				periodoItems = new SelectItem[listPeriodos.size()+1];
				SelectItem listaItem = new SelectItem();
				listaItem.setLabel("");
				listaItem.setValue(new Integer(-1));
				periodoItems[0]= listaItem;
				int i = 0;
				// Arma el combo con los valores
				for (Iterator iter = listPeriodos.iterator(); iter.hasNext();) {
					EdPPeriodoEvaluacion objEdPPeriodoEvaluacion = (EdPPeriodoEvaluacion) iter.next();
					if (objEdPPeriodoEvaluacion !=null){
						listaItem = new SelectItem();
						listaItem.setValue(objEdPPeriodoEvaluacion.getConsPeriodo());
						listaItem.setLabel(objEdPPeriodoEvaluacion.getDescripcion());
						periodoItems[i+1] = listaItem;
						i++;
					}
				}
			}
		}catch (Exception e) {
			periodoItems = null;
		}finally{
			listPeriodos = null;
		}
		return periodoItems;
	} 
		
	/*******METODOS GET Y SET PARA LAS VARIABLES QUE SE UTILIZAN DESDE EL JSP*******/
	public MensajeBean getMensaje() {
		return mensaje;
	}
	
	public void setMensaje(MensajeBean mensaje) {
		this.mensaje = mensaje;
	}
		
	public Boolean getReadOnly() {
		return readOnly;
	}
	
	public void setReadOnly(Boolean readOnly) {
		this.readOnly = readOnly;
	}
	
	public Long getCodPeriodo() {
		return codPeriodo;
	}
	
	public void setCodPeriodo(Long codPeriodo) {
		this.codPeriodo = codPeriodo;
	}
	
	public SelectItem[] getPeriodoItems() {
		return listadoPeriodos();
	}
	
	public void setPeriodoItems(SelectItem[] periodoItems) {
		this.periodoItems = periodoItems;
	}
	
	public String getRutaArchivo() {
		return rutaArchivo;
	}

	public void setRutaArchivo(String rutaArchivo) {
		this.rutaArchivo = rutaArchivo;
	}
	
	public void setNombrePeriodo(String nombrePeriodo) {
		this.nombrePeriodo = nombrePeriodo;
	}
    
    public String getNombrePeriodo() {
		return nombrePeriodo;
	}
}
